These routines are part of the SCSL Scientific Library and can be loaded
using either the ----llllssssccccssss or the ----llllssssccccssss____mmmmpppp option. The ----llllssssccccssss____mmmmpppp option
directs the linker to use the multi-processor version of the library.
When linking to SCSL with ----llllssssccccssss or ----llllssssccccssss____mmmmpppp, the default integer size is
4 bytes (32 bits). Another version of SCSL is available in which integers
are 8 bytes (64 bits). This version allows the user access to larger
memory sizes and helps when porting legacy Cray codes. It can be loaded
by using the ----llllssssccccssss____iiii8888 option or the ----llllssssccccssss____iiii8888____mmmmpppp option. A program may
use only one of the two versions; 4-byte integer and 8-byte integer
library calls cannot be mixed.
The C and C++ prototypes shown above are appropriate for the 4-byte
integer version of SCSL. When using the 8-byte integer version, the
variables of type iiiinnnntttt become lllloooonnnngggg lllloooonnnngggg and the <<<<ssssccccssssllll____ssssppppaaaarrrrsssseeee____iiii8888....hhhh>>>> header
file should be included.
DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
ZZZZPPPPSSSSLLLLDDDDLLLLTTTT solves sparse symmetric linear systems of the form _A_x = _b where _A
is a complex _n-by-_n symmetric input matrix, _b is a complex input vector
of length _n, and _x is a complex unknown vector of length _n. Hermitian
symmetric matrices are not supported at this time; to handle structures
of this type, use a full matrix representation as input to ZZZZPPPPSSSSLLLLDDDDLLLLTTTT(3S).
ZZZZPPPPSSSSLLLLDDDDLLLLTTTT uses a direct method. _A is factored into the following form:
where _L is a lower triangular matrix with unit diagonal and _D is a
diagonal matrix.
Note that NO PIVOTING FOR STABILITY is performed during factorization.
The ZZZZPPPPSSSSLLLLDDDDLLLLTTTT library contains five main routines.
* ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____OOOOrrrrddddeeeerrrriiiinnnngggg(((()))) allows the user to select one of five possible
reordering methods to be used in the matrix preprocessing phase.
* ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____PPPPrrrreeeepppprrrroooocccceeeessssssss(((()))) performs preprocessing operations on the
structure of _A (heuristic reordering to reduce fill in _L, symbolic
factorization, etc.).
* ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____FFFFaaaaccccttttoooorrrr(((()))) factors the matrix _A into _L and _D, using the
previously computed preprocessing data.
* ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____SSSSoooollllvvvveeee(((()))) solves for a vector _x, given an input vector _b.
* ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____DDDDeeeessssttttrrrrooooyyyy(((()))) frees all storage associated with the matrix _A
(including _L, _D, and various data structures computed during
preprocessing).
The user can call ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____FFFFaaaaccccttttoooorrrr(((()))) several times after a single call to
ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____PPPPrrrreeeepppprrrroooocccceeeessssssss(((()))) to factor multiple matrices with identical non-zero
structures but different values. Similarly, the user can call
ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____SSSSoooollllvvvveeee(((()))) several times after a single call to ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____FFFFaaaaccccttttoooorrrr(((()))) to
solve for multiple right-hand-sides. Also, the user can call
ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____SSSSoooollllvvvveeeeMMMM(((()))) to solve for multiple right-hand-sides all stored in a
placing the remainder of the factor matrix on disk as it is computed.
The user can call ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____OOOOOOOOCCCCPPPPaaaatttthhhh(((()))) to indicate the directory in which
the factor file should be written, and ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____OOOOOOOOCCCCLLLLiiiimmmmiiiitttt(((()))) to indicate how
much memory to use to hold portions of the factor matrix in-core. More
in-core memory generally leads to less disk I/O and higher performance
during the factorization. The only required change is to move from in-
core factorization to out-of-core factorization is the change from
ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____FFFFaaaaccccttttoooorrrr(((()))) to ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____FFFFaaaaccccttttoooorrrrOOOOOOOOCCCC(((()))). The other routines
transparently. Note that ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____FFFFaaaaccccttttoooorrrrOOOOOOOOCCCC(((()))) and subsequent calls to
ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____SSSSoooollllvvvveeee(((()))) are not parallelized (but calls to ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____SSSSoooollllvvvveeeeMMMM(((()))) are
Both ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____SSSSoooollllvvvveeee(((()))) and ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____SSSSoooollllvvvveeeeMMMM(((()))) allow the solution vector(s) to
overwrite the right-hand-side(s) when identical vectors or matrices are
supplied to these routines. For example,
CALL ZPSLDLT_SOLVE(token, b, b)
takes the right-hand-side input from _b and also returns the solution
vector in _b. When this option is used with ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____SSSSoooollllvvvveeeeMMMM(((()))), the leading
dimensions for the solution and right-hand-side matrices must agree. The
amount of memory actually saved by performing an in-place solve depends
on the number of right-hand-sides used. For a single right-hand-side,
there are no net savings versus an out-of-place solve because a temporary
copy of the input vector is made internally. For multiple right-hand-
sides the memory overhead decreases as the ratio of right-hand-sides to
processors used increases.
AAAArrrrgggguuuummmmeeeennnnttttssss
These routines have the following arguments:
_t_o_k_e_n (input) ZZZZPPPPSSSSLLLLDDDDLLLLTTTT can handle multiple matrices simultaneously.
The _t_o_k_e_n distinguishes between active matrices. The _t_o_k_e_n
passed to ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____FFFFaaaaccccttttoooorrrr(((()))) must match the _t_o_k_e_n used in some
previous call to ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____PPPPrrrreeeepppprrrroooocccceeeessssssss(((()))). Similarly, the _t_o_k_e_n
passed to ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____SSSSoooollllvvvveeee(((()))) must match the _t_o_k_e_n used in some
previous call to ZZZZPPPPSSSSLLLLDDDDLLLLTTTT____FFFFaaaaccccttttoooorrrr(((()))). 0000 <<<<==== _t_o_k_e_n <<<<==== 11119999....
_m_e_t_h_o_d (input) An integer specifying the ordering method used during
Two environment variables can affect the operation of ordering methods 3
and 4. SSSSPPPPAAAARRRRSSSSEEEE____NNNNUUUUMMMM____OOOORRRRDDDDEEEERRRRSSSS can be used to change the number of orderings
performed from the default of OOOOMMMMPPPP____NNNNUUUUMMMM____TTTTHHHHRRRREEEEAAAADDDDSSSS for Method 3 and
(2*OOOOMMMMPPPP____NNNNUUUUMMMM____TTTTHHHHRRRREEEEAAAADDDDSSSS) for Method 4. SSSSPPPPAAAARRRRSSSSEEEE____FFFFEEEEEEEEDDDDBBBBAAAACCCCKKKK____FFFFIIIILLLLEEEE can be set to the
path and file name where the feedback information will be kept;
otherwise, the default feedback file is $$$$HHHHOOOOMMMMEEEE////....ssssppppaaaarrrrsssseeeeFFFFeeeeeeeeddddbbbbaaaacccckkkk. This file
will be less than 5K bytes.
The environment variable OOOOMMMMPPPP____NNNNUUUUMMMM____TTTTHHHHRRRREEEEAAAADDDDSSSS determines the number of
processors that are used for the numerical factorization and solve
phases. Out-of-core solves can be performed in groups of PPPPSSSSLLLLDDDDLLLLTTTT____OOOOOOOOCCCCBBBBLLLLKKKK
right-hand-sides per processor. Setting the environment variable
PPPPSSSSLLLLDDDDLLLLTTTT____VVVVEEEERRRRBBBBOOOOSSSSEEEE causes ZZZZPPPPSSSSLLLLDDDDLLLLTTTT to output information about the
factorization.
NNNNOOOOTTTTEEEESSSS
These routines are optimized and parallelized for the SGI R8000 and